Random number generators (RNGs) are important for applications which require the creation and use of a sequence of numbers or symbols lacking any order or pattern. RNGs can be implemented in applications such as cryptography, gambling, computer modeling or simulation, and statistical sampling. In many cryptographic applications, for example, the underlying encryption protocols are only as good (e.g., secure and/or robust) as the random numbers they use. As such, randomness is a desirable feature and having access to many cheap high quality random bits is often essential. RNGs may typically fall into two categories: pseudo random number generators (PRNGs) and physical random number generators. A PRNG inputs a small random seed and generates a longer string which appears random. However, a PRNG uses an entirely deterministic process and so the knowledge of the algorithm used together with a seed is sufficient to guess the exact longer sequence. Cryptographic algorithms using poorly designed PRNGs may be subject to cryptoanalytic attack. In contrast, physical RNGs use physical phenomena such as entropic or acoustical variation or radioactive decay, for example, to produce random numbers. Theoretically the bit stream they produce is completely unpredictable.